#!/usr/bin/env python
# coding: utf-8

# In[1]:


import pandas as pd
import matplotlib.pyplot as plt
import numpy as np


# In[2]:


df = pd.read_csv('./模块四 第一章/28.代码/log.txt')
df.head()


# In[3]:


df = pd.read_csv('./模块四 第一章/28.代码/log.txt', header=None, sep='\t')
df.head()


# In[4]:


df.columns = ['id','api','count','res_time_sum','res_time_min','res_time_max','res_time_avg','interval','created_at']


# In[5]:


df.head(2)


# In[6]:


df.sample(5) # 随机采样，多次执行，数据不一样，看大概


# In[7]:


df.shape


# In[8]:


df.dtypes


# In[9]:


df.info() #查看内存占用空间


# In[10]:


df['api'].describe()


# In[11]:


df = df.drop('api', axis=1) # 优化内存，指定axis，指定删除一列


# In[12]:


df.head(2)


# In[13]:


df.info()


# In[14]:


df['created_at'].describe()


# In[15]:


df[df.created_at == '2019-05-01']


# In[16]:


df[(df.created_at >= '2019-05-01') & (df.created_at <= '2019-05-02')]


# In[17]:


df.index # 当前索引


# In[18]:


df.index = df['created_at']


# In[19]:


# df['2019-05-01']


# In[20]:


df.info()


# In[21]:


df.index = pd.to_datetime(df.created_at)


# In[22]:


df.index


# In[23]:


df['2019-5-1']


# In[24]:


df.interval.describe()


# In[25]:


df.interval.unique()


# In[26]:


df = df.drop(['id','interval'], axis=1)
df.head()


# In[27]:


df.info()


# In[28]:


df.describe()


# In[29]:


df['count'].hist() # 初步分析count，直方图
plt.show()


# In[30]:


# 表示接口调用分布情况，大部分都在10次以内，反映出每分钟调用的次数分布情况
df['count'].hist(bins=30)
plt.show()


# In[31]:


# 切出一天的数据，绘制一天时段的接口调用情况
df['2019-5-1']['count'].plot()
plt.show()


# In[32]:


# 凌晨时间无人访问，下午2-3点第一个访问高峰，晚上8、9点，第二个访问高峰


# In[33]:


# 用count重采样，用一个小时进行采样，没那么多数据点了，图像比较平滑
df2 = df['2019-5-1']


# In[34]:


df2 = df2[['count']].resample('1H').mean()
df2


# In[35]:


df2['count'].plot()
plt.show()


# In[36]:


# 折线图和直方图，可以看到业务的高峰时段在什么地方，分不清具体时间，绘制柱状图
plt.figure(figsize=(10,3)) # 单位是英寸
df2['count'].plot(kind="bar")
plt.xticks(rotation=60) # 文字旋转角度
plt.show()


# In[37]:


# 分析有没有异常时段，访问接口过于频繁，可能就是黑客潮水攻击
df['2019-5-1'][['count']].boxplot(showmeans=True, meanline=True)
plt.show()


# In[38]:


df[df['count']>20]


# In[39]:


# 某一天的响应时间，平均响应时间
df['2019-5-1']['res_time_avg'].plot()
plt.show()


# In[40]:


df['2019-5-1'][['res_time_avg']].boxplot()
plt.show()


# In[41]:


df2 = df['2019-5-1']
df2[df['res_time_avg']>1000]


# In[42]:


# 2019-05-01 00:34:48 1 1694.47 1694.47 1694.47 1694.0 2019-05-01 00:34:48 定义为异常值
df['2019-5-1'][['res_time_sum','res_time_min','res_time_max','res_time_avg']].plot()
plt.show()


# In[44]:


data = df['2019-5-1'].resample('20T').mean()
data[['res_time_sum','res_time_min','res_time_max','res_time_avg']].plot()
plt.show()


# In[45]:


# 业务高峰时段，下午2-3点，晚上7-8点，响应时间都是上升的


# In[46]:


df['2019-5-1':'2019-5-10']['count'].plot()
plt.show()


# In[48]:


# 每天的情况都差不多，下面看看周末和平常是不是一样的
df['2019-5-2'].index.weekday # 0 代表星期一， 1 代表星期二， 5和6分别代表周六和周日


# In[49]:


df['weekday'] = df.index.weekday


# In[50]:


df.head(2)


# In[52]:


# 判断是否是周末，是不是5、6
df['weekend'] = df['weekday'].isin({5,6})
df.head(5)


# In[53]:


# 对weekend 进行分组，对count列求平均值
df.groupby('weekend')['count'].mean()


# In[54]:


# 周末调用平均次数多，7.57
# 周末哪个时段调用次数比较高

df.groupby(['weekend', df.index.hour])['count'].mean()


# In[55]:


# 周末和非周末，具体时间对比，绘制成图形，否则不直观
df.groupby(['weekend', df.index.hour])['count'].mean().plot()
plt.show()


# In[57]:


# 周末和非周末数据叠加
df.groupby(['weekend', df.index.hour])['count'].mean().unstack(level=0)


# In[58]:


df.groupby(['weekend', df.index.hour])['count'].mean().unstack(level=0).plot()
plt.show()


# In[ ]:




